/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.    
 */

using Velocity4Net.Runtime.Parse;
using Velocity4Net.Util;
namespace Velocity4Net.Runtime
{
    /**
     * This wraps the original parser SimplePool class.  It also handles
     * instantiating ad-hoc parsers if none are available.
     *
     * @author <a href="mailto:sergek@lokitech.com">Serge Knystautas</a>
     * @version $Id: RuntimeInstance.java 384374 2006-03-08 23:19:30Z nbubna $
     * @since 1.5
     */
    public class ParserPoolImpl : ParserPool
    {

        SimplePool pool = null;
        int max = RuntimeConstants.NUMBER_OF_PARSERS;

        /**
         * Create the underlying "pool".
         * @param rsvc
         */
        public void initialize(RuntimeServices rsvc)
        {
            max = rsvc.GetInt(RuntimeConstants.PARSER_POOL_SIZE, RuntimeConstants.NUMBER_OF_PARSERS);
            pool = new SimplePool(max);

            for (int i = 0; i < max; i++)
            {
                pool.put(rsvc.createNewParser());
            }

            //if (rsvc.Log.IsDebugEnabled)
            //{
            //    rsvc.Log.Debug("Created '" + max + "' parsers.");
            //}
        }

        /**
         * Call the wrapped pool.  If none are available, it will create a new
         * temporary one.
         * @return A parser Object.
         */
        public Parser get()
        {
            return (Parser)pool.get();
        }

        /**
         * Call the wrapped pool.
         * @param parser
         */
        public void add(Parser parser)
        {
            parser.ReInit((CharStream)null);
            pool.put(parser);
        }
    }
}